<html>
    <head>
        <title>取消令牌提供程序</title>
    </head>
    <body>
        <script>
            // 取消令牌提供程序  Cancellation Token Provider 

                    /*
                        CancellationToken 启用线程、线程池工作项 或者 Task 之间的协作取消，
                        
                        ABP 提供了 ICancellationTokenProvider 以获取CancellationToken 本身。
                    */

                    /*
                        一、何时使用手动取消令牌？   When to Use Manual Cancellation Tokens?

                                ABP 几乎在任何地方都自动化了取消令牌的使用。

                                例如，在asp.net core 应用程序中， ABP 自动从 HttpContext.RequestAborted 中获取 CancellationToken,

                                并在数据库查询和其他 "可取消" 的地方使用它。 
                                
                                所以，大多数时候，你不需要处理 CancellationToken 对象来在方法之间传递它们。

                                你不需要使用 ICancellationTokenProvider ，除非你想在自己的逻辑中添加可取消的功能，或将取消令牌传递给框架之外的方法。
                    */

                    /*
                        二、ICancellationTokenProvider 服务

                                ICancellationTokenProvider是一个抽象，为不同的场景提供CancellationToken。


                                一般来说，你应该传递CancellationToken 作为你的方法使用它的参数。

                                使用ICancellationTokenProvider 你不需要为每个方法传递 CancellationToken.

                                ICancellationTokenProvider 可以通过依赖注入进行注册，并从其源提供令牌。

                                        eg：

                                            using System.Threading.Tasks;
                                            using Volo.Abp.DependencyInjection;
                                            using Volo.Abp.Threading;

                                            namespace MyProject
                                            {
                                                public class MyService : ITransientDependency
                                                {
                                                    private readonly ICancellationTokenProvider _cancellationTokenProvider;

                                                    public MyService(ICancellationTokenProvider cancellationTokenProvider)
                                                    {
                                                        _cancellationTokenProvider = cancellationTokenProvider; // 注入取消令牌提供程序服务
                                                    }

                                                    public async Task DoItAsync()
                                                    {
                                                        while (_cancellationTokenProvider.Token.IsCancellationRequested == false)
                                                        {
                                                            
                                                        }
                                                    }
                                                }
                                            }        
                    */

                    /*
                        三、内置提供程序

                                1、HttpContextCancellationTokenProvider:  asp.net core 应用程序的 "默认提供程序" 。
                                                    
                                                它只是提供了一个 CancellationToken,它是来自 HttpContext.RequestAborted(Aborted：中止、中断) 的Web请求的来源。

                                2、NullCancellationTokenProvider：一个内置的提供程序，它总是提供CancellationToken.None。
                                                
                                                如果不能使用其他提供程序，则使用它。
                               
                    */

                    /*
                        四、实现一个自定义取消令牌提供程序

                                你可以通过创建一个实现 ICancellationTokenProvider 的类来轻松创建你的 ICancellationTokenProvider实现：

                                eg：
                                    using System.Threading;

                                    namespace AbpDemo
                                    {
                                        public class MyCancellationTokenProvider
                                            : ICancellationTokenProvider, 
                                            ITransientDependency // 也可以注册成 Singleton 
                                        {
                                            public CancellationToken Token { get; } // 返回一个取消令牌
                                        }
                                    }
                    */
        </script>
    </body>
</html>